package cn.edu.zsc.rbac.service.collection;

import cn.edu.zsc.rbac.domain.dto.UserDto;
import cn.edu.zsc.rbac.domain.entity.Dept;
import cn.edu.zsc.rbac.domain.entity.Role;
import cn.edu.zsc.rbac.domain.entity.User;
import cn.edu.zsc.rbac.domain.vo.Result;
import cn.edu.zsc.rbac.domain.vo.UserVo;
import cn.edu.zsc.rbac.service.IDeptService;
import cn.edu.zsc.rbac.service.IRoleService;
import cn.edu.zsc.rbac.service.IUserService;
import cn.edu.zsc.rbac.util.SingletonFactory;

import java.time.LocalDateTime;
import java.util.Collection;
@Deprecated
public class UserService extends BaseService<User, UserDto,UserVo> implements IUserService {
    /**
     * 根据⽤户传输对象（UserDto）和⽤户 ID 创建⼀个新的⽤户实体对象（User）。
     *
     * @param dto 传⼊的⽤户传输对象，包含⽤户的基本信息
     * @param id 为新创建的⽤户实体指定的唯⼀ ID
     * @return 返回创建好的⽤户实体对象
     */
    @Override
    public User createEntity(UserDto dto, int id) {
        LocalDateTime now = LocalDateTime.now();
        // 使⽤传⼊的⽤户传输对象（UserDto）中的信息创建⼀个新的⽤户实体对象（User）
        return new  User(id,now,now, dto.username, dto.name, dto.mobile, dto.email, dto.deptId, dto.roleId);
        // 为新创建的⽤户实体对象分配唯⼀的 ID
    }
    /**
     * 根据⽤户传输对象（UserDto）更新⽤户实体对象（User）的属性值。
     *
     * @param dto 传⼊的⽤户传输对象，包含需要更新的⽤户信息
     * @param user 需要更新的⽤户实体对象
     */
    @Override
    void updateEntity(UserDto dto, User user) {
        user.updateAt = LocalDateTime.now();
        // 使⽤传⼊的⽤户传输对象（UserDto）更新⽤户实体对象的属性
        user.username = dto.username;
        user.name = dto.name;
        user.mobile = dto.mobile;
        user.email = dto.email;
        user.deptId = dto.deptId;
        user.roleId = dto.roleId;
    }
    /**
            * 创建⼀个新的⽤户并将其保存到数据存储中。
            *
            * 此⽅法会根据传⼊的 UserDto 对象创建⼀个新的 User 实例，并进⾏⼀系列的验证。
            * 它⾸先检查是否超过存储容量，然后验证部⻔和⻆⾊是否存在，最后将新创建的⽤户保存到数
    据存储中。
            *
            * @param dto 包含新⽤户信息的 UserDto 对象
 * @return 返回⼀个 Result 对象，表示操作是否成功，并携带相应的消息和创建的⽤户数据
 */
    @Override
    public Result create(UserDto dto) {
        // 验证部⻔ ID 是否存在
        if (!deptService.existsById(dto.deptId)) {
            // 如果指定的部⻔ ID 不存在，返回失败结果
            return Result.failure("创建失败，不存在该部⻔");
        }
        // 验证⻆⾊ ID 是否存在
        if (!roleService.existsById(dto.roleId)) {
            // 如果指定的⻆⾊ ID 不存在，返回失败结果
            return Result.failure("创建失败，不存在该⻆⾊");
        }
        return super.create(dto);
    }
    /**
     * 将给定的 User 对象转换为 UserVo 对象。
     * <p>
     * 此⽅法根据 User 对象的属性，构建⼀个新的 UserVo 对象，并为其赋值。
     * 其中，UserVo 中的部⻔和⻆⾊信息会通过查找相应的部⻔和⻆⾊信息来填充。
     * </p>
     *
     * @param user 需要转换的 User 对象
     * @return 返回转换后的 UserVo 对象
     */
    // 其它代码 ...
    private final IDeptService deptService;
    private final IRoleService roleService;
    private UserService() {
        this.deptService = SingletonFactory.getInstance(DeptService.class);
        this.roleService = SingletonFactory.getInstance(RoleService.class);
        temp = new UserVo[0];
    }
    @Override
    UserVo convertToVo(User user) {
        // 查找部⻔名称
        String deptName = "";
        // 调⽤ DeptService 的 findById ⽅法，根据⽤户的部⻔ ID 查找部⻔信息
        Dept dept = deptService.findById(user.deptId);
        if (dept != null) {
            // 如果找到部⻔信息，将部⻔名称赋值给 deptName
            deptName = dept.name;
        }
        // 查找⻆⾊名称
        String roleName = "";
        // 调⽤ RoleService 的 findById ⽅法，根据⽤户的⻆⾊ ID 查找⻆⾊信息
        Role role = roleService.findById(user.roleId);
        if (role != null) {
            // 如果找到⻆⾊信息，将⻆⾊名称赋值给 roleName
            roleName = role.name;
        }
        // 创建并返回 UserVo 对象
        return new UserVo(user.getId(),user.createAt,user.updateAt, user.username, user.name, user.mobile, user.email, user.deptId, user.roleId, user.enabled, deptName, roleName);
    }
    /**
            * 获取所有有效的⽤户数据。
            * <p>
 * 本⽅法遍历存储⽤户数据的数组，将所有已创建且有效的⽤户（即 ID 对应的⽤户对象不为
`null`）复制到⼀个临时数组中。
            * 然后返回查询成功的结果，并将该临时数组作为返回的数据。
            * </p>
            *
            * @return 返回⼀个 `Result` 对象，包含查询结果的状态和所有有效⽤户的数据
 */
    /**
     * 是否存在⽤户
     *
     * @param id ⽤户 ID
     * @return true 表示存在，false 表示不存在
     */
    /**
     * 更新指定 ID 的⽤户信息。
     * <p>
     * 此⽅法通过传⼊的 `UserDto` 更新⼀个已经存在的⽤户的信息。它⾸先验证⽤户 ID 是否
     有效，然后检查部⻔和⻆⾊是否存在，
     * 最后更新指定⽤户的各项属性，包括⽤户名、姓名、⼿机号、邮箱、部⻔ ID 和⻆⾊ ID。
     * </p>
     *
     * @param dto 包含要更新的⽤户信息的 `UserDto` 对象
     * @param id 需要更新的⽤户的 ID
     * @return 返回⼀个 `Result` 对象，表示操作是否成功，并携带相应的消息
     */
    @Override
    public Result update(UserDto dto, int id) {
        // 验证部⻔ ID 是否存在
        if (!deptService.existsById(dto.deptId)) {
            // 如果指定的部⻔ ID 不存在，返回失败结果
            return Result.failure("更新失败，不存在该部⻔");
        }
        // 验证⻆⾊ ID 是否存在
        if (!roleService.existsById(dto.roleId)) {
            // 如果指定的⻆⾊ ID 不存在，返回失败结果
            return Result.failure("更新失败，不存在该⻆⾊");
        }
        return super.update(dto, id);
    }
    /**
            * 检查是否有⽤户属于 deptId 对应的部⻔
            *
            * @param deptId 部⻔ ID
 * @return 如果存在⽤户属于这个部⻔，返回 true；否则返回 false
            */
    @Override
    public boolean deptInUse(int deptId) {
        boolean inUse = false;
        Collection<User> set = data.values();
        // 遍历存储⽤户数据的数组
        for (User user : set) {
            // 检查⽤户是否存在且该⽤户的部⻔ ID 等于传⼊的部⻔ ID
            if (user != null && user.deptId == deptId) {
                inUse = true;
                break;
            }
        }
        return inUse;
    }
    /**
     * 检查是否有⽤户拥有 roleId 对应的⻆⾊
     *
     * @param roleId ⻆⾊ ID
     * @return 如果存在⽤户具有这个⻆⾊，返回 true；否则返回 false
     */
    @Override
    public boolean roleInUse(int roleId) {
        boolean inUse = false;
        Collection<User> set = data.values();
        // 遍历存储⽤户数据的数组
        for (User user : set) {
            // 检查⽤户是否存在且该⽤户的⻆⾊ ID 等于传⼊的⻆⾊ ID
            if (user != null && user.roleId == roleId) {
                inUse = true;
                break;
            }
        }
        return inUse;
    }
    /**
     * 切换指定 ID 对应的数据的启⽤/禁⽤状态。
     *
     * <p>该⽅法⽤于根据⽤户传⼊的 ID 切换数据对象的 `enabled` 状态：
     * - 若 ID ⽆效（⼩于 1、超出范围或数据不存在），则返回失败结果。
     * - 若 ID 有效，则反转该数据的 `enabled` 状态，并返回相应的成功信息。</p>
     *
     * @param id 要切换状态的数据 ID
     * @return `Result` 对象，表示操作结果：
     * - 成功时返回 `"启⽤成功"` 或 `"禁⽤成功"`。
     * - 失败时返回 `"切换状态失败，不存在该数据"`。
     */
    @Override
    public Result toggle(int id) {
        // 检查 ID 是否有效
        if (!existsById(id)) {
            return Result.failure("切换状态失败，不存在该数据");
        }
        User user = data.get(id);
        user.enabled = !user.enabled;
        // 根据新的状态返回不同的成功消息
        return Result.success(user.enabled ? "启⽤成功" : "禁⽤成功", null);
    }
}
